package com.steven.sync.mianshi;


import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.CyclicBarrier;

/**
 * 一个容器两个方法 add ,size,
 * 两个线程 一个线程add 10次 另外一个线程监听到大小等于5 的时候给出提示并结束
 */
public class Test1 {

    //    volatile修饰引用类型改变了其他线程是看不到的，除非引用本身改了
    static volatile List list = Collections.synchronizedList(new ArrayList<>());


    public void add(Object o) {
        list.add(o);
    }

    public Integer size() {
        return list.size();
    }


    public static void main(String[] args) {
        Test1 test1 = new Test1();


        new Thread(() -> {
            synchronized (test1){
                if (test1.size() != 5) {
                    try {
                        test1.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println("线程结束");
                //不会释放锁
                test1.notify();
            }
        }).start();

        new Thread(() -> {
            synchronized (test1){
                for (int i = 0; i < 10; i++) {
                    System.out.println(i);
                    test1.add(new Object());
                    if(test1.size() ==5){
                        try {
                            test1.notify();
                            test1.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }

        }).start();



    }


}
